﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RS.Echarts.Models.XAxis
{
    // <summary>
    /// 直角坐标系grid中的x轴，一般情况下单个grid组件最多只能放上下两个x轴，多于两个x轴需要通过配置offset属性防止同个位置多个x轴的重叠。
    /// </summary>
    public class XAxis
    {
        /// <summary>
        /// 组件ID。默认不指定。指定则可用于在option或者API中引用组件。
        /// </summary>
        public string? Id { get; set; }

        /// <summary>
        /// 是否显示x轴。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// x轴所在的grid的索引，默认位于第一个grid。
        /// </summary>
        public int GridIndex { get; set; }

        /// <summary>
        /// 从v5.3.0开始支持，在多个x轴为数值轴的时候，可以开启该配置项自动对齐刻度。只对'value'和'log'类型的轴有效。
        /// </summary>
        public bool AlignTicks { get; set; }

        /// <summary>
        /// x轴的位置。可选'top'、'bottom'，默认grid中的第一个x轴在grid的下方('bottom')，第二个x轴视第一个x轴的位置放在另一侧。
        /// 注：若未将xAxis.axisLine.onZero设为false，则该项无法生效。
        /// </summary>
        public string? Position { get; set; }

        /// <summary>
        /// X轴相对于默认位置的偏移，在相同的position上有多个X轴的时候有用。
        /// 注：若未将xAxis.axisLine.onZero设为false，则该项无法生效。
        /// </summary>
        public int Offset { get; set; }

        /// <summary>
        /// 坐标轴类型。可选'value'（数值轴，适用于连续数据）、'category'（类目轴，适用于离散的类目数据，为该类型时类目数据可自动从series.data或dataset.source中取，或者可通过xAxis.data设置类目数据）、'time'（时间轴，适用于连续的时序数据，与数值轴相比时间轴带有时间的格式化，在刻度计算上也有所不同，例如会根据跨度的范围来决定使用月，星期，日还是小时范围的刻度）、'log'（对数轴，适用于对数数据，对数轴下的堆积柱状图或堆积折线图可能带来很大的视觉误差，并且在一定情况下可能存在非预期效果，应避免使用）。
        /// </summary>
        public string? Type { get; set; }

        /// <summary>
        /// 坐标轴名称。
        /// </summary>
        public string? Name { get; set; }

        /// <summary>
        /// 坐标轴名称显示位置。可选'start'、'middle'或者'center'、'end'。
        /// </summary>
        public string? NameLocation { get; set; }

        /// <summary>
        /// 坐标轴名称的文字样式。
        /// </summary>
        public TextStyle NameTextStyle { get; set; }

        /// <summary>
        /// 坐标轴名称与轴线之间的距离。
        /// </summary>
        public int NameGap { get; set; }

        /// <summary>
        /// 坐标轴名字旋转，角度值。
        /// </summary>
        public int NameRotate { get; set; }

        /// <summary>
        /// 坐标轴名字的截断。
        /// </summary>
        public NameTruncate NameTruncate { get; set; }

        /// <summary>
        /// 是否是反向坐标轴。
        /// </summary>
        public bool Inverse { get; set; }

        /// <summary>
        /// 坐标轴两边留白策略，类目轴和非类目轴的设置和表现不一样。
        /// 类目轴中boundaryGap可以配置为true和false。默认为true，这时候刻度只是作为分隔线，标签和数据点都会在两个刻度之间的带(band)中间。
        /// 非类目轴，包括时间，数值，对数轴，boundaryGap是一个两个值的数组，分别表示数据最小值和最大值的延伸范围，可以直接设置数值或者相对的百分比，在设置min和max后无效。示例：boundaryGap: ['20%', '20%']。
        /// </summary>
        public object? BoundaryGap { get; set; }

        /// <summary>
        /// 坐标轴刻度最小值。可以设置成特殊值'dataMin'，此时取数据在该轴上的最小值作为最小刻度。不设置时会自动计算最小值保证坐标轴刻度的均匀分布。
        /// 在类目轴中，也可以设置为类目的序数（如类目轴data: ['类A', '类B', '类C']中，序数2表示'类C'。也可以设置为负数，如 -3）。
        /// 当设置成function形式时，可以根据计算得出的数据最大最小值设定坐标轴的最小值。如：min: function (value) { return value.min - 20; }，其中value是一个包含min和max的对象，分别表示数据的最大最小值，这个函数可返回坐标轴的最小值，也可返回null/undefined来表示“自动计算最小值”（返回null/undefined从v4.8.0开始支持）。
        /// </summary>
        public object? Min { get; set; }

        /// <summary>
        /// 坐标轴刻度最大值。可以设置成特殊值'dataMax'，此时取数据在该轴上的最大值作为最大刻度。不设置时会自动计算最大值保证坐标轴刻度的均匀分布。
        /// 在类目轴中，也可以设置为类目的序数（如类目轴data: ['类A', '类B', '类C']中，序数2表示'类C'。也可以设置为负数，如 -3）。
        /// 当设置成function形式时，可以根据计算得出的数据最大最小值设定坐标轴的最小值。如：max: function (value) { return value.max - 20; }，其中value是一个包含min和max的对象，分别表示数据的最大最小值，这个函数可返回坐标轴的最大值，也可返回null/undefined来表示“自动计算最大值”（返回null/undefined从v4.8.0开始支持）。
        /// </summary>
        public object? Max { get; set; }

        /// <summary>
        /// 只在数值轴中（type: 'value'）有效。是否是脱离0值比例。设置成true后坐标刻度不会强制包含零刻度。在双数值轴的散点图中比较有用。在设置min和max之后该配置项无效。
        /// </summary>
        public bool Scale { get; set; }

        /// <summary>
        /// 坐标轴的分割段数，需要注意的是这个分割段数只是个预估值，最后实际显示的段数会在这个基础上根据分割后坐标轴刻度显示的易读程度作调整。在类目轴中无效。
        /// </summary>
        public int SplitNumber { get; set; }

        /// <summary>
        /// 自动计算的坐标轴最小间隔大小。例如可以设置成1保证坐标轴分割刻度显示成整数。{ minInterval: 1 }只在数值轴或时间轴中（type: 'value'或'time'）有效。
        /// </summary>
        public int MinInterval { get; set; }

        /// <summary>
        /// 自动计算的坐标轴最大间隔大小。例如，在时间轴（（type: 'time'））可以设置成3600 * 24 * 1000保证坐标轴分割刻度最大为一天。{ maxInterval: 3600 * 24 * 1000 }只在数值轴或时间轴中（type: 'value'或'time'）有效。
        /// </summary>
        public int MaxInterval { get; set; }

        /// <summary>
        /// 强制设置坐标轴分割间隔。因为splitNumber是预估的值，实际根据策略计算出来的刻度可能无法达到想要的效果，这时候可以使用interval配合min、max强制设定刻度划分，一般不建议使用。无法在类目轴中使用。在时间轴（type: 'time'）中需要传时间戳，在对数轴（type: 'log'）中需要传指数值。
        /// </summary>
        public object? Interval { get; set; }

        /// <summary>
        /// 对数轴的底数，只在对数轴中（type: 'log'）有效。
        /// </summary>
        public int LogBase { get; set; }

        /// <summary>
        /// 从v5.5.1开始支持，用于指定轴的起始值。
        /// </summary>
        public int StartValue { get; set; }

        /// <summary>
        /// 坐标轴是否是静态无法交互。
        /// </summary>
        public bool Silent { get; set; }

        /// <summary>
        /// 坐标轴的标签是否响应和触发鼠标事件，默认不响应。事件参数如下：
        /// {
        ///     // 组件类型，xAxis, yAxis, radiusAxis, angleAxis
        ///     // 对应组件类型都会有一个属性表示组件的index，例如xAxis就是xAxisIndex
        ///     componentType: string,
        ///     // 未格式化过的刻度值, 点击刻度标签有效
        ///     value: '',
        ///     // 坐标轴名称, 点击坐标轴名称有效
        ///     name: ''
        /// }
        /// </summary>
        public bool TriggerEvent { get; set; }

        /// <summary>
        /// 坐标轴轴线相关设置。
        /// </summary>
        public AxisLine AxisLine { get; set; }

        /// <summary>
        /// 坐标轴刻度相关设置。
        /// </summary>
        public AxisTick AxisTick { get; set; }

        /// <summary>
        /// 从v4.6.0开始支持，坐标轴次刻度线相关设置。注意：次刻度线无法在类目轴（type: 'category'）中使用。示例：1) 函数绘图中使用次刻度线 2) 在对数轴中使用次刻度线。
        /// </summary>
        public MinorTick MinorTick { get; set; }

        /// <summary>
        /// 坐标轴刻度标签的相关设置。
        /// </summary>
        public AxisLabel AxisLabel { get; set; }

        /// <summary>
        /// 坐标轴在grid区域中的分隔线。
        /// </summary>
        public SplitLine SplitLine { get; set; }

        /// <summary>
        /// 从v4.6.0开始支持，坐标轴在grid区域中的次分隔线。次分割线会对齐次刻度线minorTick。
        /// </summary>
        public MinorSplitLine MinorSplitLine { get; set; }

        /// <summary>
        /// 坐标轴在grid区域中的分隔区域，默认不显示。
        /// </summary>
        public SplitArea SplitArea { get; set; }

        /// <summary>
        /// 类目数据，在类目轴（type: 'category'）中有效。
        /// 如果没有设置type，但是设置了axis.data，则认为type是'category'。
        /// 如果设置了type是'category'，但没有设置axis.data，则axis.data的内容会自动从series.data中获取，这会比较方便。不过注意，axis.data指明的是'category'轴的取值范围。如果不指定而是从series.data中获取，那么只能获取到series.data中出现的值。比如说，假如series.data为空时，就什么也获取不到。
        /// 示例：
        /// // 所有类目名称列表
        /// data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
        /// // 每一项也可以是具体的配置项，此时取配置项中的`value`为类目名
        /// data: [{ value: '周一', // 突出周一 textStyle: { fontSize: 20, color: 'red' } }, '周二', '周三', '周四', '周五', '周六', '周日']
        /// </summary>
        public List<AxisData>? Data { get; set; }

        /// <summary>
        /// 坐标轴指示器配置项。
        /// </summary>
        public AxisPointer AxisPointer { get; set; }

        /// <summary>
        /// 从v5.6.0开始支持，坐标轴tooltip设置，注意需设置triggerEvent为true并启用全局option.tooltip组件。
        /// </summary>
        public Tooltip Tooltip { get; set; }

        /// <summary>
        /// 是否开启动画。
        /// </summary>
        public bool Animation { get; set; }

        /// <summary>
        /// 是否开启动画的阈值，当单个系列显示的图形数量大于这个阈值时会关闭动画。
        /// </summary>
        public int AnimationThreshold { get; set; }

        /// <summary>
        /// 初始动画的时长，支持回调函数，可以通过每个数据返回不同的时长实现更戏剧的初始动画效果：animationDuration: function (idx) { // 越往后的数据时长越大 return idx * 100; }。
        /// </summary>
        public object? AnimationDuration { get; set; }

        /// <summary>
        /// 初始动画的缓动效果。不同的缓动效果可以参考缓动示例。
        /// </summary>
        public string? AnimationEasing { get; set; }

        /// <summary>
        /// 初始动画的延迟，支持回调函数，可以通过每个数据返回不同的delay时间实现更戏剧的初始动画效果。如下示例：animationDelay: function (idx) { // 越往后的数据延迟越大 return idx * 100; }，也可以看该示例。
        /// </summary>
        public object? AnimationDelay { get; set; }

        /// <summary>
        /// 数据更新动画的时长。支持回调函数，可以通过每个数据返回不同的时长实现更戏剧的更新动画效果：animationDurationUpdate: function (idx) { // 越往后的数据时长越大 return idx * 100; }。
        /// </summary>
        public object? AnimationDurationUpdate { get; set; }

        /// <summary>
        /// 数据更新动画的缓动效果。
        /// </summary>
        public string? AnimationEasingUpdate { get; set; }

        /// <summary>
        /// 数据更新动画的延迟，支持回调函数，可以通过每个数据返回不同的delay时间实现更戏剧的更新动画效果。如下示例：animationDelayUpdate: function (idx) { // 越往后的数据延迟越大 return idx * 100; }，也可以看该示例。
        /// </summary>
        public object? AnimationDelayUpdate { get; set; }

        /// <summary>
        /// X轴所有图形的zlevel值。zlevel用于Canvas分层，不同zlevel值的图形会放置在不同的Canvas中，Canvas分层是一种常见的优化手段。
        /// 我们可以把一些图形变化频繁（例如有动画）的组件设置成一个单独的zlevel。需要注意的是过多的Canvas会引起内存开销的增大，在手机端上需要谨慎使用以防崩溃。
        /// zlevel大的Canvas会放在zlevel小的Canvas的上面。
        /// </summary>
        public int ZLevel { get; set; }

        /// <summary>
        /// X轴组件的所有图形的z值。控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。z相比zlevel优先级更低，而且不会创建新的Canvas。
        /// </summary>
        public int Z { get; set; }
    }

    // <summary>
    /// 坐标轴名称的截断配置类。
    /// </summary>
    public class NameTruncate
    {
        /// <summary>
        /// 最大宽度，用于限制坐标轴名称显示的最大宽度，超过该宽度将根据ellipsis配置进行截断或处理。
        /// </summary>
        public int MaxWidth { get; set; }

        /// <summary>
        /// 截断时显示的省略号内容，默认为"..."，可自定义为其他字符串。当坐标轴名称超过MaxWidth时，将在截断处显示该省略号。
        /// </summary>
        public string? Ellipsis { get; set; }
    }


    /// <summary>
    /// 坐标轴轴线相关设置类。
    /// </summary>
    public class AxisLine
    {
        /// <summary>
        /// 是否显示轴线。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// 是否在零刻度上显示轴线，仅对类目轴有效，在type为'category'时有效。
        /// </summary>
        public bool OnZero { get; set; }

        /// <summary>
        /// 当有多个类目轴时，指定在哪个类目轴的零刻度上显示轴线，仅在type为'category'且onZero为true时有效。
        /// </summary>
        public int OnZeroAxisIndex { get; set; }

        /// <summary>
        /// 轴线两端的标记类型，可以是'solid'（实线）、'dashed'（虚线）、'dotted'（点线），也可以是自定义的图片路径（用于在轴线两端显示特定的图形标记）。
        /// </summary>
        public string? Symbol { get; set; }

        /// <summary>
        /// 轴线两端标记的大小，单位px，用于控制轴线两端标记的尺寸。
        /// </summary>
        public int SymbolSize { get; set; }

        /// <summary>
        /// 轴线两端标记的偏移量，第一个值表示水平偏移，第二个值表示垂直偏移，单位px，用于调整轴线两端标记相对于轴线的位置。
        /// </summary>
        public int[]? SymbolOffset { get; set; }

        /// <summary>
        /// 轴线的样式配置。
        /// </summary>
        public LineStyle LineStyle { get; set; }
    }

    /// <summary>
    /// 直线样式配置类，用于配置坐标轴轴线、刻度线等的样式。
    /// </summary>
    public class LineStyle
    {
        /// <summary>
        /// 直线的颜色，可以使用RGB表示，如'rgb(128, 128, 128)'，若要加上alpha通道，可使用RGBA，如'rgba(128, 128, 128, 0.5)'，也可以使用十六进制格式，如'#ccc'。
        /// </summary>
        public string? Color { get; set; }

        /// <summary>
        /// 直线的宽度，单位px，用于设置直线的粗细程度。
        /// </summary>
        public int Width { get; set; }

        /// <summary>
        /// 直线的类型，可以是'solid'（实线）、'dashed'（虚线）、'dotted'（点线），用于指定直线的样式。
        /// </summary>
        public string? Type { get; set; }

        /// <summary>
        /// 直线的阴影颜色，支持的格式同Color，用于给直线添加阴影效果（需要同时设置shadowBlur等属性才会生效）。
        /// </summary>
        public string? ShadowColor { get; set; }

        /// <summary>
        /// 直线的阴影模糊大小，用于控制阴影的模糊程度，值越大阴影越模糊。
        /// </summary>
        public int ShadowBlur { get; set; }

        /// <summary>
        /// 直线的阴影偏移量，第一个值表示水平偏移，第二个值表示垂直偏移，单位px，用于调整阴影相对于直线的位置。
        /// </summary>
        public int[]? ShadowOffset { get; set; }
    }

    /// <summary>
    /// 坐标轴刻度相关设置类。
    /// </summary>
    public class AxisTick
    {
        /// <summary>
        /// 是否显示坐标轴刻度。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// 刻度线是否与标签对齐，默认不对齐。在类目轴（type为'category'）中，若设置为true，则刻度线会与类目标签对齐；在数值轴等其他类型轴中，该属性也会影响刻度线与数值标签的相对位置关系。
        /// </summary>
        public bool AlignWithLabel { get; set; }

        /// <summary>
        /// 坐标轴刻度的显示间隔，可用于控制刻度的疏密程度。例如设置为2表示每隔一个刻度显示一个标签（在类目轴中，可根据实际需求调整显示的类目间隔）。在某些情况下，如果不希望自动计算间隔，可通过此属性手动指定。
        /// </summary>
        public int? Interval { get; set; }

        /// <summary>
        /// 刻度线是否朝内显示，即刻度线在坐标轴内部。默认为false，刻度线在坐标轴外部。对于一些特殊的图表布局需求，可通过设置此属性为true来调整刻度线的显示方向。
        /// </summary>
        public bool Inside { get; set; }

        /// <summary>
        /// 刻度线的长度，单位px，用于控制刻度线的长短。不同类型的图表可能需要根据视觉效果调整刻度线长度，可通过此属性进行设置。
        /// </summary>
        public int Length { get; set; }

        /// <summary>
        /// 刻度线的样式配置。
        /// </summary>
        public LineStyle LineStyle { get; set; }

        /// <summary>
        /// 自定义刻度值数组，用于指定显示哪些特定的刻度值。当设置了此属性后，将按照数组中的值来显示刻度，而不是根据默认的计算方式。这在需要展示特定刻度点的情况下非常有用，例如只显示整数刻度或者特定的关键刻度。
        /// </summary>
        public int[]? CustomValues { get; set; }
    }

    /// <summary>
    /// 坐标轴次刻度线相关设置类。注意：次刻度线无法在类目轴（type: 'category'）中使用。示例：1) 函数绘图中使用次刻度线 2) 在对数轴中使用次刻度线。
    /// </summary>
    public class MinorTick
    {
        /// <summary>
        /// 是否显示次刻度线。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// 次刻度线的分割段数，用于控制次刻度线的数量和分布。类似于坐标轴的`SplitNumber`属性，但仅针对次刻度线。例如设置为5，则会在两个主刻度之间显示5个次刻度（具体显示数量可能会根据实际情况微调，以保证刻度分布的合理性）。
        /// </summary>
        public int SplitNumber { get; set; }

        /// <summary>
        /// 次刻度线的长度，单位px，用于调整次刻度线的长短。通常次刻度线会比主刻度线短，以区分主次刻度，但可根据图表设计需求通过此属性进行自定义。
        /// </summary>
        public int Length { get; set; }

        /// <summary>
        /// 次刻度线的样式配置。
        /// </summary>
        public LineStyle LineStyle { get; set; }
    }

    /// <summary>
    /// 坐标轴刻度标签的相关设置类。
    /// </summary>
    public class AxisLabel
    {
        /// <summary>
        /// 是否显示刻度标签。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// 刻度标签的位置，可选值有 'inside'（在坐标轴内侧）、'outside'（在坐标轴外侧，默认值）等，用于控制标签相对坐标轴的显示位置，可根据图表布局和美观需求进行调整。
        /// </summary>
        public string? Position { get; set; }

        /// <summary>
        /// 刻度标签的间隔，用于控制标签的显示频率。例如设置为 2，表示每隔一个刻度显示一个标签，以此来避免标签过于密集而导致显示混乱的情况，可根据实际情况手动调整显示间隔。
        /// </summary>
        public int? Interval { get; set; }

        /// <summary>
        /// 刻度标签的旋转角度，单位为度，用于对标签文字进行旋转，以适应不同的图表空间布局，比如在水平空间有限时可将标签旋转一定角度来避免重叠。
        /// </summary>
        public int Rotate { get; set; }

        /// <summary>
        /// 刻度标签的文本样式配置，用于设置标签文字的颜色、字体、大小等外观属性。
        /// </summary>
        public TextStyle TextStyle { get; set; }

        /// <summary>
        /// 刻度标签的格式化函数，用于自定义标签显示的文本内容。接收当前刻度值作为参数，可以根据业务需求对刻度值进行格式化处理后返回想要展示的字符串内容。例如将数值格式化为带有特定单位的字符串，或者对时间格式进行转换等。
        /// 示例：Formatter = (value) => { return value + "kg"; } 会在原有数值刻度值后面添加 "kg" 单位进行展示。
        /// </summary>
        public Func<object, string>? Formatter { get; set; }

        /// <summary>
        /// 刻度标签的边距，单位px，用于设置标签与坐标轴或其他图表元素之间的距离，可让图表整体看起来更加美观、清晰，避免元素之间过于拥挤。
        /// </summary>
        public int Margin { get; set; }

        /// <summary>
        /// 刻度标签的截断配置，用于处理标签文字过长导致显示溢出等问题，可通过设置最大宽度等方式对过长的标签进行截断处理并显示省略号等标识。
        /// </summary>
        public LabelTruncate? Truncate { get; set; }

        /// <summary>
        /// 刻度标签的颜色映射，用于根据刻度值所在的不同范围设置不同的文字颜色，以增强图表的可视化效果和数据可读性。例如可以将正值和负值设置为不同颜色来直观区分。
        /// 示例：ColorMapping = new Dictionary<object, string> { { 0, "black" }, { value => value > 0, "green" }, { value => value < 0, "red" } };
        /// </summary>
        public Dictionary<object, string>? ColorMapping { get; set; }

        /// <summary>
        /// 刻度标签是否响应和触发鼠标事件，默认不响应。若设置为 true，则鼠标悬停等操作在标签上时可触发相应事件，便于实现交互功能，例如弹出提示框显示更详细信息等。
        /// </summary>
        public bool TriggerEvent { get; set; }
    }

    /// <summary>
    /// 刻度标签截断配置类，用于处理标签文字过长时的截断相关设置。
    /// </summary>
    public class LabelTruncate
    {
        /// <summary>
        /// 最大宽度，单位px，用于限制标签文字显示的最大宽度，超过该宽度时将根据 Ellipsis 属性的设置进行截断处理。
        /// </summary>
        public int MaxWidth { get; set; }

        /// <summary>
        /// 截断时显示的省略号内容，默认为 "..."，可自定义为其他字符串，用于在标签文字被截断处显示相应标识。
        /// </summary>
        public string? Ellipsis { get; set; }
    }

    /// <summary>
    /// 坐标轴在grid区域中的分隔线相关设置类。
    /// </summary>
    public class SplitLine
    {
        /// <summary>
        /// 是否显示分隔线，用于控制是否在坐标轴所在的 `grid` 区域中展示分隔线，可根据图表简洁性和可视化需求进行设置。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// 分隔线的类型，可以是'solid'（实线）、'dashed'（虚线）、'dotted'（点线），用于定义分隔线的样式外观，使其在视觉上呈现出不同的效果，满足不同图表风格的要求。
        /// </summary>
        public string? Type { get; set; }

        /// <summary>
        /// 分隔线的宽度，单位px，用于调整分隔线的粗细程度，根据整体图表的比例和美观度来合理设置该值。
        /// </summary>
        public int Width { get; set; }

        /// <summary>
        /// 分隔线的颜色，支持常见的颜色表示方式，如RGB格式（如'rgb(128, 128, 128)'）、带有透明度的RGBA格式（如'rgba(128, 128, 128, 0.5)'）以及十六进制格式（如'#ccc'），用于设置分隔线的颜色，使其与图表整体色调相匹配。
        /// </summary>
        public string? Color { get; set; }

        /// <summary>
        /// 分隔线的阴影颜色，支持的格式同 `Color`，用于给分隔线添加阴影效果（通常需要结合 `ShadowBlur` 等属性一起使用来完整呈现阴影效果），增强图表的层次感和立体感。
        /// </summary>
        public string? ShadowColor { get; set; }

        /// <summary>
        /// 分隔线的阴影模糊大小，用于控制阴影的模糊程度，值越大阴影越模糊，以此来调整阴影效果的强弱，使阴影看起来更加自然或者符合特定的视觉风格。
        /// </summary>
        public int ShadowBlur { get; set; }

        /// <summary>
        /// 分隔线的阴影偏移量，是一个包含两个元素的数组，第一个元素表示水平方向的偏移量，第二个元素表示垂直方向的偏移量，单位px，用于精确调整阴影相对于分隔线本体的位置。
        /// </summary>
        public int[]? ShadowOffset { get; set; }

        /// <summary>
        /// 分隔线的线性渐变配置，用于实现分隔线颜色的渐变效果，可设置渐变的起始点、结束点以及渐变的颜色过渡等，让分隔线在视觉上更具变化和吸引力。
        /// </summary>
        public LinearGradient? LinearGradient { get; set; }

        /// <summary>
        /// 分隔线的径向渐变配置，同样用于实现颜色渐变效果，但与线性渐变不同，它是以一个中心点向外辐射的方式进行颜色过渡，可根据具体图表设计需求选择使用。
        /// </summary>
        public RadialGradient? RadialGradient { get; set; }
    }

    /// <summary>
    /// 线性渐变配置类，用于定义线性渐变的相关参数，应用于如分隔线等元素的颜色渐变设置。
    /// </summary>
    public class LinearGradient
    {
        /// <summary>
        /// 线性渐变的起始点坐标，是一个包含两个元素的数组，第一个元素表示水平方向的坐标（通常取值范围在0 - 1之间，表示相对位置），第二个元素表示垂直方向的坐标（同样取值范围在0 - 1之间），用于指定渐变开始的位置。
        /// 例如：[0, 0] 表示从左上角开始渐变，[1, 1] 表示从右下角开始渐变。
        /// </summary>
        public float[]? Xy0 { get; set; }

        /// <summary>
        /// 线性渐变的结束点坐标，格式与 `Xy0` 相同，用于指定渐变结束的位置，通过这两个点的设置可以确定渐变的方向和范围。
        /// </summary>
        public float[]? Xy1 { get; set; }

        /// <summary>
        /// 线性渐变的颜色停止点数组，每个元素是一个包含颜色值和位置值的对象。颜色值可以是常见的颜色表示方式，位置值取值范围在0 - 1之间，表示该颜色在渐变过程中的位置占比。
        /// 示例：new List<ColorStop> { new ColorStop { Color = "#ff0000", Offset = 0 }, new ColorStop { Color = "#0000ff", Offset = 1 } } 表示从红色渐变到蓝色。
        /// </summary>
        public List<ColorStop> ColorStops { get; set; }
    }

    /// <summary>
    /// 径向渐变配置类，用于定义径向渐变的相关参数，应用于如分隔线等元素的颜色渐变设置。
    /// </summary>
    public class RadialGradient
    {
        /// <summary>
        /// 径向渐变的中心点坐标，格式与线性渐变的 `Xy0` 类似，是一个包含两个元素的数组，用于指定渐变的中心位置，取值范围通常在0 - 1之间，表示相对位置。
        /// </summary>
        public float[]? Cxcy { get; set; }

        /// <summary>
        /// 径向渐变的半径，取值范围在0 - 1之间，表示相对半径大小，用于确定渐变的范围，即从中心点向外辐射的距离范围。
        /// </summary>
        public float Radius { get; set; }

        /// <summary>
        /// 径向渐变的颜色停止点数组，与线性渐变的 `ColorStops` 类似，每个元素是一个包含颜色值和位置值的对象，用于定义渐变过程中的颜色过渡情况。
        /// </summary>
        public List<ColorStop> ColorStops { get; set; }
    }

    /// <summary>
    /// 颜色停止点类，用于在渐变配置中指定特定颜色及其在渐变中的位置。
    /// </summary>
    public class ColorStop
    {
        /// <summary>
        /// 颜色值，可以是常见的颜色表示方式，如RGB、RGBA、十六进制等格式，用于定义在渐变过程中该位置呈现的具体颜色。
        /// </summary>
        public string? Color { get; set; }

        /// <summary>
        /// 位置值，取值范围在0 - 1之间，表示该颜色在整个渐变过程中的相对位置占比，例如0表示起始位置，1表示结束位置。
        /// </summary>
        public float Offset { get; set; }
    }

    /// <summary>
    /// 坐标轴在grid区域中的次分隔线相关设置类。次分割线会对齐次刻度线minorTick。
    /// </summary>
    public class MinorSplitLine
    {
        /// <summary>
        /// 是否显示次分隔线，用于控制在坐标轴所在的 `grid` 区域中是否展示次分隔线，可根据图表的详细程度和可视化需求进行设置，有时候为了简化图表可以选择不显示。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// 次分隔线的类型，可选值与 `SplitLine` 中的类型一致，如'solid'（实线）、'dashed'（虚线）、'dotted'（点线），用于定义次分隔线的外观样式，使其与主分隔线或整体图表风格相匹配。
        /// </summary>
        public string? Type { get; set; }

        /// <summary>
        /// 次分隔线的宽度，单位px，用于调整次分隔线的粗细程度，通常可以设置得比主分隔线稍细一些，以体现主次之分，不过具体可根据图表美观度等需求灵活调整。
        /// </summary>
        public int Width { get; set; }

        /// <summary>
        /// 次分隔线的颜色，支持常见的颜色表示方式，例如RGB格式（如'rgb(128, 128, 128)'）、带有透明度的RGBA格式（如'rgba(128, 128, 128, 0.5)'）以及十六进制格式（如'#ccc'），用于设置次分隔线的颜色，使其与图表整体色调协调。
        /// </summary>
        public string? Color { get; set; }

        /// <summary>
        /// 次分隔线的阴影颜色，支持的格式同 `Color`，用于给次分隔线添加阴影效果（通常需要结合 `ShadowBlur` 等属性一起使用来完整呈现阴影效果），增强图表的层次感和立体感，不过一般较少使用在次分隔线上，具体根据实际设计需求而定。
        /// </summary>
        public string? ShadowColor { get; set; }

        /// <summary>
        /// 次分隔线的阴影模糊大小，用于控制阴影的模糊程度，值越大阴影越模糊，以此来调整阴影效果的强弱，使阴影看起来更加自然或者符合特定的视觉风格，同样较少常用，按需设置。
        /// </summary>
        public int ShadowBlur { get; set; }

        /// <summary>
        /// 次分隔线的阴影偏移量，是一个包含两个元素的数组，第一个元素表示水平方向的偏移量，第二个元素表示垂直方向的偏移量，单位px，用于精确调整阴影相对于次分隔线本体的位置，一般不常用，根据具体情况选用。
        /// </summary>
        public int[]? ShadowOffset { get; set; }

        /// <summary>
        /// 次分隔线的线性渐变配置，用于实现次分隔线颜色的渐变效果，可设置渐变的起始点、结束点以及渐变的颜色过渡等，让次分隔线在视觉上更具变化和吸引力，不过使用频率相对较低，在特定复杂图表设计中可能会用到。
        /// </summary>
        public LinearGradient? LinearGradient { get; set; }

        /// <summary>
        /// 次分隔线的径向渐变配置，同样用于实现颜色渐变效果，但与线性渐变不同，它是以一个中心点向外辐射的方式进行颜色过渡，使用场景较少，根据具体图表创意需求选用。
        /// </summary>
        public RadialGradient? RadialGradient { get; set; }
    }


    /// <summary>
    /// 坐标轴在grid区域中的分隔区域相关设置类。默认不显示。
    /// </summary>
    public class SplitArea
    {
        /// <summary>
        /// 是否显示分隔区域，用于控制在坐标轴所在的 `grid` 区域中是否展示分隔区域，通常默认不显示，可根据特定的可视化需求和图表风格来决定是否开启显示。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// 分隔区域的颜色设置，支持多种表示方式，可以是单一颜色，例如常见的RGB格式（如'rgb(128, 128, 128)'）、带有透明度的RGBA格式（如'rgba(128, 128, 128, 0.5)'）以及十六进制格式（如'#ccc'）；也可以是颜色数组，用于设置不同区域的不同颜色，以实现更丰富的视觉效果。
        /// 例如设置为两个颜色的数组时，会以交替的方式呈现不同颜色的分隔区域，常用于区分不同的数据区间等情况。
        /// </summary>
        public object? Color { get; set; }

        /// <summary>
        /// 分隔区域的阴影颜色，支持的格式同单一颜色的 `Color` 属性，用于给分隔区域添加阴影效果（通常需要结合 `ShadowBlur` 等属性一起使用来完整呈现阴影效果），增强图表的层次感和立体感，不过是否使用要根据具体图表设计来定。
        /// </summary>
        public string? ShadowColor { get; set; }

        /// <summary>
        /// 分隔区域的阴影模糊大小，用于控制阴影的模糊程度，值越大阴影越模糊，以此来调整阴影效果的强弱，使阴影看起来更加自然或者符合特定的视觉风格，按需设置该属性值。
        /// </summary>
        public int ShadowBlur { get; set; }

        /// <summary>
        /// 分隔区域的阴影偏移量，是一个包含两个元素的数组，第一个元素表示水平方向的偏移量，第二个元素表示垂直方向的偏移量，单位px，用于精确调整阴影相对于分隔区域本体的位置，在需要阴影效果时可进行相应配置。
        /// </summary>
        public int[]? ShadowOffset { get; set; }

        /// <summary>
        /// 分隔区域的透明度，取值范围在0（完全透明）到1（完全不透明）之间，用于调整分隔区域整体的透明程度，可根据需要让分隔区域更突出或者更隐晦一些，以配合图表整体的视觉效果。
        /// </summary>
        public float? Opacity { get; set; }

        /// <summary>
        /// 分隔区域的形状，可选值如'rect'（矩形，默认值）等，不同的形状可以营造出不同的视觉分区效果，目前可能常用的是矩形，但也可根据特定的创意需求扩展为其他形状（若框架支持的话）。
        /// </summary>
        public string? Shape { get; set; }
    }

    /// <summary>
    /// 用于表示坐标轴（主要是类目轴）上单个数据项的类，每个数据项可以包含具体的值以及对应的样式等配置信息。
    /// </summary>
    public class AxisData
    {
        /// <summary>
        /// 类目轴上该数据项对应的实际值，例如在类目轴表示一周七天时，这里可以是"周一"、"周二"等具体的类目文本内容。
        /// 在数值轴等其他情况时，也可以是对应的数值等数据类型，具体取决于使用场景。
        /// </summary>
        public object? Value { get; set; }

        /// <summary>
        /// 该数据项对应的文本样式配置，用于设置该类目或数据显示时的文字颜色、字体、大小等外观属性，可实现对每个数据项文本样式的个性化定制。
        /// </summary>
        public TextStyle? TextStyle { get; set; }

        /// <summary>
        /// 该数据项的自定义属性集合，可用于存储一些额外的业务相关或图表展示相关的自定义信息，例如可以存放一个标识数据重要性的标记等，方便后续根据这些自定义属性来做进一步的逻辑处理或样式调整。
        /// </summary>
        public Dictionary<string, object>? CustomProps { get; set; }

        /// <summary>
        /// 该数据项对应的提示信息内容，当鼠标悬停等交互操作触发在该数据项上时，可以显示这些提示信息，用于展示更详细的数据详情或者相关说明内容，提升图表的交互性和信息展示丰富度。
        /// 示例：可以设置为"这是周一的数据详情" 等具体的提示文本内容。
        /// </summary>
        public string? Tooltip { get; set; }
    }

}
